﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using Microsoft.VisualBasic;

namespace BaiTap2
{
    /// <summary>
    /// Bài tập 1 : Tiền Xử Lý
    /// Author: 1242055 Phạm Thanh Hùng - 1242074 Trịnh Bá Lộc
    /// </summary>
    public partial class frmMain : Form
    {
        #region Variable

        //Lưu dữ liệu
        public List<string[]> dulieu = new List<string[]>();

        //Được phép chuẩn hóa,chia giỏ
        public bool isProcess = false;

        #endregion

        #region Constant

        private const string FRM_NUMBER = @"^[-+]?[0-9]*\.?[0-9]+$";
        private const string TITLE_MSX = "Thông Báo";
        private const string NOMINAL = "Nominal";
        private const string NUMERIC = "Numeric";
        private const string QUESTION_MARK = "?";
        private const string SRC_MOFILE = "MoFile";
        private const string SRC_DIENGIATRI = "DienGiaTri";
        private const string SRC_CHIAGIO = "ChiaGio";
        private const string SRC_CHUANHOA = "ChuanHoa";
        private const string SRC_LUUFILE = "LuuFile";

        #endregion

        #region Event

        //Khởi tạo
        public frmMain()
        {
            InitializeComponent();
        }

        //Form load
        private void frmMain_Load(object sender, EventArgs e)
        {
            this.Size = new Size(780, 420);
            this.MinimumSize = new Size(780, 420);
            this.MaximumSize = new Size(780, 420);
            this.Location = new Point(250, 200);

            //Hiển thị màn hình mở file
            hienManHinh(SRC_MOFILE);
            btn_mofile.Focus();
        }

        //Đóng chương trình
        private void btn_thoat_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        /*----------------------------------MỞ FILE------------------------------------------------*/

        //Mở file dữ liệu và xử lý dữ liệu
        private void btn_mofile_Click(object sender, EventArgs e)
        {
            //Hiển thị màn hình mở file
            hienManHinh(SRC_MOFILE);
        }

        //Mở file
        private void btn_mo_Click(object sender, EventArgs e)
        {
            //Choose file
            OpenFileDialog openFile = new OpenFileDialog();
            openFile.Title = "Open file";
            openFile.InitialDirectory = System.Environment.CurrentDirectory;
            openFile.Filter = "CSV Files (.csv)|*.csv|ARFF Files (.arff)|*.arff|All Files (*.*)|*.*";
            openFile.FilterIndex = 1;
            openFile.RestoreDirectory = true;

            if (openFile.ShowDialog() == DialogResult.OK)
            {
                //Xóa dữ liệu cũ
                dulieu.Clear();

                //Gán tên file
                lbl_valuetenfile.Text = System.IO.Path.GetFileName(openFile.FileName);

                //Đọc dữ liệu từ file
                string err = docFile(openFile.FileName);

                //Nếu không có lỗi thì hiển thị thông tin file
                if (string.IsNullOrEmpty(err))
                {
                    //Lấy số thuộc tính và số mẫu
                    lbl_valuesothuoctinh.Text = Convert.ToString(dulieu[0].Length);
                    lbl_valuesomau.Text = Convert.ToString(dulieu.Count() - 1);

                    //Gán kiểu dữ liệu vào từng dòng tương ứng
                    string[] dongkieudulieu = new string[dulieu[0].Length];

                    //Hiện thị thuộc tính và kiểu dữ liệu tương ứng
                    for (int j = 0; j < dulieu[0].Length; j++)
                    {
                        DataGridViewRow row = (DataGridViewRow)dgv_ThuocTinh.Rows[0].Clone();
                        string thuoctinh = dulieu[0][j];
                        string kieudulieu = layKieuDuLieu(j);

                        row.Cells[0].Value = thuoctinh.Replace("\"", "");
                        row.Cells[1].Value = kieudulieu;
                        dgv_ThuocTinh.Rows.Add(row);

                        dongkieudulieu[j] = kieudulieu;
                    }

                    //Thêm kiểu dữ liệu của mỗi thuộc tính
                    dulieu.Add(dongkieudulieu);

                    //Cấm chia giỏ hoặc chuẩn hóa
                    if (isProcess)
                    {
                        isProcess = false;
                    }
                }
            }
        }

        /*----------------------------------ĐIỀN DỮ LIỆU THIẾU-----------------------------------*/

        //Điền dữ liệu bị thiếu theo từng kiểu dữ liệu của thuộc tính
        private void btn_diengiatrithieu_Click(object sender, EventArgs e)
        {
            //Hiển thị màn hình điền giá trị thiếu
            hienManHinh(SRC_DIENGIATRI);
        }

        //Hiển thị dữ liệu thiếu
        private void pnl_diengiatri_Paint(object sender, PaintEventArgs e)
        {
            if (dulieu.Count() == 0)
            {
                MessageBox.Show("Dữ liệu rỗng! Vui lòng thêm dữ liệu!", TITLE_MSX, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                btn_dien.Enabled = false;
            }
            else if (isProcess)
            {
                MessageBox.Show("Hiện tại không có dữ liệu thiếu!", TITLE_MSX, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                btn_dien.Enabled = false;
            }
            else
            {
                //Hiển thị dữ liệu lên
                hienThiDuLieu();
                btn_dien.Enabled = true;
            }
        }

        //Điền dữ liệu bị thiếu theo từng kiểu dữ liệu của thuộc tính
        private void btn_dien_Click(object sender, EventArgs e)
        {
            //Kiểm tra nếu có dữ liệu thiếu thì cho phép điền giá trị thiếu
            bool isChange = false;
            for (int d = 1; d < dulieu.Count() - 1; d++)
            {
                for (int c = 0; c < dulieu[0].Length; c++)
                {
                    if (dulieu[d][c].Equals(QUESTION_MARK))
                    {
                        isChange = true;
                        break;
                    }
                }
            }
            if (isChange)
            {

                int indexLast = dulieu.Count - 1;
                for (int j = 0; j < dulieu[0].Length; j++)
                {
                    if (dulieu[indexLast][j].Equals(NOMINAL))
                    {
                        dienGiaTriNominal(j);
                    }
                    else
                    {
                        dienGiaTriNumeric(j);
                    }
                }
                hienThiDuLieu();

                isProcess = true;
            }
            else
            {
                MessageBox.Show("Không có dữ liệu thiếu", TITLE_MSX, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        /*-----------------------------------CHIA GIỎ---------------------------------------------*/

        //Hiển thị màn hình chia giỏ
        private void btn_chiagio_Click(object sender, EventArgs e)
        {
            //Hiển thị màn hình chia giỏ
            hienManHinh(SRC_CHIAGIO);
        }

        //Chia giỏ dữ liệu
        private void btn_chia_Click(object sender, EventArgs e)
        {
            if (dulieu.Count() == 0)
            {
                MessageBox.Show("Dữ liệu rỗng! Vui lòng thêm dữ liệu!", TITLE_MSX, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            else if (!isProcess)
            {
                MessageBox.Show("Chưa điền giá trị thiếu!", TITLE_MSX, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            else
            {
                //Kiểm tra bắt nhập số giỏ
                if (String.IsNullOrEmpty(txt_sogio.Text))
                {
                    MessageBox.Show("Vui lòng nhập số giỏ!", TITLE_MSX, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    txt_sogio.Focus();
                }
                else
                {
                    //Kiểm tra số giỏ nhập vào hợp lệ
                    if (System.Text.RegularExpressions.Regex.IsMatch("[^0-9]", txt_sogio.Text))
                    {
                        MessageBox.Show("Vui lòng nhập số!", TITLE_MSX, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        txt_sogio.Focus();
                    }
                    else
                    {
                        //Xử lý chia giỏ
                        int soGio = Convert.ToInt32(txt_sogio.Text); //Số giỏ nhập vào

                        int indexLast = dulieu.Count - 1;

                        if (rdb_chieurong.Checked)//Chia giỏ theo chiều rộng
                        {
                            for (int j = 0; j < dulieu[0].Length; j++)//Duyệt tất cả các thuộc tính
                            {
                                if (dulieu[indexLast][j].Equals(NUMERIC))//Nếu là thuộc tính numeric mới tiến hành chia giỏ
                                {
                                    chiaGioChieuRong(j, soGio);
                                }
                            }
                        }
                        if (rdb_chieusau.Checked)//Chia giỏ theo chiều sâu
                        {
                            for (int j = 0; j < dulieu[0].Length; j++)//Duyệt tất cả các thuộc tính
                            {
                                if (dulieu[indexLast][j].Equals(NUMERIC))//Nếu là thuộc tính numeric mới tiến hành chia giỏ
                                {
                                    chiaGioChieuSau(j, soGio);
                                }
                            }
                        }
                    }
                }
            }
        }

        /*-----------------------------------CHUẨN HÓA---------------------------------------------*/

        //Hiển thị màn hình chuẩn hóa
        private void btn_chuanhoa_Click(object sender, EventArgs e)
        {
            //Hiển thị màn hình chuẩn hóa
            hienManHinh(SRC_CHUANHOA);
            if (dulieu.Count() != 0)
            {
                // Bind combobox to dictionary
                Dictionary<int, string> listThuocTinh = new Dictionary<int, string>();
                int indexLast = dulieu.Count - 1;
                for (int j = 0; j < dulieu[0].Length; j++)
                {
                    if (dulieu[indexLast][j].Equals(NUMERIC))//Nếu là thuộc tính numeric mới tiến hành chia giỏ
                    {
                        listThuocTinh.Add(j, dulieu[0][j].Replace("\"", ""));
                    }
                }
                cbx_thuoctinh.DataSource = new BindingSource(listThuocTinh, null);
                cbx_thuoctinh.DisplayMember = "Value";
                cbx_thuoctinh.ValueMember = "Key";

            }
        }

        //Tiến hành chuẩn hóa
        private void btn_Chay_Click(object sender, EventArgs e)
        {
            if (dulieu.Count() == 0)
            {
                MessageBox.Show("Dữ liệu rỗng! Vui lòng thêm dữ liệu!", TITLE_MSX, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            else if (!isProcess)
            {
                MessageBox.Show("Chưa điền giá trị thiếu!", TITLE_MSX, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            else
            {
                // Get combobox selection (in handler)
                int value = ((KeyValuePair<int, string>)cbx_thuoctinh.SelectedItem).Key;

                if (rdb_min_max.Checked)//Chia giỏ theo chiều rộng
                {
                    chuanHoaMinMax(value);
                }
                if (rdb_z_score.Checked)//Chia giỏ theo chiều sâu
                {
                    chuanHoaZScore(value);
                }

                //Hiển thị dữ liệu chuẩn hóa
                hienThiDuLieuChuanHoa();
            }
        }

        /*-----------------------------------LƯU FILE---------------------------------------------*/

        //Lưu file sau khi xử lý
        private void btn_luufile_Click(object sender, EventArgs e)
        {
            if (dulieu.Count() == 0)
            {
                MessageBox.Show("Dữ liệu rỗng! Vui lòng thêm dữ liệu!", TITLE_MSX, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            else if (!isProcess)
            {
                MessageBox.Show("Chưa điền giá trị thiếu!", TITLE_MSX, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            else
            {
                //Choose file
                SaveFileDialog saveFile = new SaveFileDialog();
                saveFile.Title = "Lưu file";
                saveFile.InitialDirectory = System.Environment.CurrentDirectory;
                saveFile.Filter = "CSV file (*.*)|*.csv*";
                string[] name = lbl_valuetenfile.Text.Split(".".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                saveFile.FileName = name[0] + "_output." + name[1];
                saveFile.FilterIndex = 1;
                saveFile.RestoreDirectory = true;

                if (saveFile.ShowDialog() == DialogResult.OK)
                {
                    string fileExportName = Path.GetFileName(saveFile.FileName);
                    string path = Path.GetDirectoryName(saveFile.FileName);

                    string ADD = "\\";

                    string fileName = path + ADD + fileExportName;

                    try
                    {
                        FileSystem.FileOpen(1, fileName, OpenMode.Output, OpenAccess.Write, OpenShare.Shared, -1);
                        for (int intRCtr = 0; intRCtr < dulieu.Count() - 1; intRCtr++)
                        {
                            FileSystem.WriteLine(1, dulieu[intRCtr]);
                        }

                        FileSystem.FileClose(1);

                    }
                    catch (Exception)
                    {
                        MessageBox.Show("Ghi file lỗi", TITLE_MSX, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    finally
                    {
                        FileSystem.FileClose(1);
                        MessageBox.Show("Ghi file thành công", TITLE_MSX, MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
        }
        
        #endregion

        #region Method

        //Hiển thị màn hình
        private void hienManHinh(string tenManHinh)
        {
            switch (tenManHinh)
            {
                case SRC_MOFILE:
                    pnl_mofile.Visible = true;
                    pnl_mofile.Location = new Point(148, 48);
                    pnl_diengiatri.Visible = false;
                    pnl_chiagio.Visible = false;
                    pnl_chuanhoa.Visible = false;

                    break;
                case SRC_DIENGIATRI:
                    pnl_mofile.Visible = false;
                    pnl_diengiatri.Visible = true;
                    pnl_diengiatri.Location = new Point(148, 48);
                    pnl_chiagio.Visible = false;
                    pnl_chuanhoa.Visible = false;
                    break;
                case SRC_CHIAGIO:
                    pnl_mofile.Visible = false;
                    pnl_diengiatri.Visible = false;
                    pnl_chiagio.Visible = true;
                    pnl_chiagio.Location = new Point(148, 48);
                    pnl_chuanhoa.Visible = false;
                    break;
                case SRC_CHUANHOA:
                    pnl_mofile.Visible = false;
                    pnl_diengiatri.Visible = false;
                    pnl_chiagio.Visible = false;
                    pnl_chuanhoa.Visible = true;
                    pnl_chuanhoa.Location = new Point(148, 48);
                    break;
            }
        }

        /*----------------------------------MỞ FILE------------------------------------------------*/

        //Lấy kiểu dữ liệu của thuộc tính
        private string layKieuDuLieu(int j)
        {
            string kieudulieu = NOMINAL;
            //Duyết hết các dòng của thuộc tính thứ j
            for (int i = 1; i < dulieu.Count() - 1; i++)
            {
                //Nếu là số thì dừng
                if (!dulieu[i][j].Equals(QUESTION_MARK) && kiemTraSo(dulieu[i][j]))
                {
                    kieudulieu = NUMERIC;
                    break;
                }
            }

            return kieudulieu;
        }

        //Kiểm tra giá trị thuộc tính có là số không
        private bool kiemTraSo(string value)
        {
            Regex regex = new Regex(FRM_NUMBER);
            return regex.IsMatch(value);
        }

        //Đọc dữ liệu từ file
        private string docFile(string filePath)
        {
            string error = "";
            try
            {
                string sFileContents = "";
                //Đọc hết dữ liệu trong file vào biến sFileContents.
                using (StreamReader oStreamReader = new StreamReader(File.OpenRead(filePath)))
                {
                    sFileContents = oStreamReader.ReadToEnd();//Đọc đến hết file
                }

                //Tách từng dòng dữ liệu ra. Gặp ký tự xuống dòng thì tách.
                string[] sFileLines = sFileContents.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

                foreach (string sFileLine in sFileLines)//Duyệt qua từng dòng
                {//Mỗi dòng tương ứng
                    dulieu.Add(sFileLine.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries));//Tách từng giá trị ra. Gặp dấu , thì tách ra
                }
                MessageBox.Show("Đọc dữ liệu thành công!", TITLE_MSX, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)//Lỗi đọc file
            {
                string message = "Đọc dữ liệu lỗi. Chi tiết: \n" + ex.Message + "\n Vui lòng kiểm tra lại!";
                MessageBox.Show(message, TITLE_MSX, MessageBoxButtons.OK, MessageBoxIcon.Error);
                error = message;
            }
            return error;
        }

        /*----------------------------------ĐIỀN DỮ LIỆU THIẾU-----------------------------------*/

        //Gán giá trị thiếu cho thuộc tính nominal bắng giá trị xuất hiện nhiều nhất.
        private void dienGiaTriNominal(int j)
        {
            string giaTriXhNhieu = timGiaTriXhNhieu(j);
            for (int i = 1; i < dulieu.Count() - 2; i++)
            {
                if (dulieu[i][j].Equals(QUESTION_MARK))
                {
                    dulieu[i][j] = giaTriXhNhieu;
                }
            }
        }

        //Tìm giá trị xuất hiện nhiều nhất.
        private string timGiaTriXhNhieu(int j)
        {
            string ret = "";
            int demxhNhieu = demXuatHien(dulieu[1][j], j);
            for (int i = 2; i < dulieu.Count() - 2; i++)
            {
                if (demXuatHien(dulieu[i][j], j) > demxhNhieu)
                {
                    demxhNhieu = demXuatHien(dulieu[i][j], j);
                    ret = dulieu[i][j];
                }
            }
            return ret;
        }

        //Đếm số lần xuất hiện.
        private int demXuatHien(string giaTri, int j)
        {
            int dem = 0;
            for (int i = 1; i < dulieu.Count() - 2; i++)
            {
                if (dulieu[i][j].Equals(giaTri))
                {
                    dem++;
                }
            }
            return dem;
        }

        //Gán giá trị thiếu cho thuộc tính numeric bắng giá trị trung bình của thuộc tính.
        private void dienGiaTriNumeric(int j)
        {
            double giaTriTB = tinhGiaTriTB(j);
            for (int i = 1; i < dulieu.Count() - 2; i++)
            {
                if (dulieu[i][j].Equals(QUESTION_MARK))
                {
                    dulieu[i][j] = giaTriTB.ToString();
                }
            }
        }

        //Tìm giá trị trung bình của thuộc tính j
        private double tinhGiaTriTB(int j)
        {
            int n = Convert.ToInt32(lbl_valuesomau.Text);
            double s = 0;
            for (int i = 1; i < dulieu.Count() - 2; i++)
            {
                if (!dulieu[i][j].Equals(QUESTION_MARK))
                {
                    s = s + Convert.ToDouble(dulieu[i][j]);
                }
            }
            return Math.Round(s / n, 3);
        }

        //Hiện thị dữ liệu lên lưới
        private void hienThiDuLieu()
        {
            dgv_dulieu.Columns.Clear();
            dgv_dulieu.Rows.Clear();
            dgv_dulieu.ColumnCount = dulieu[0].Length;
            for (int i = 0; i < dulieu[0].Length; i++)
            {
                dgv_dulieu.Columns[i].Name = dulieu[0][i].Replace("\"", "");
            }
            for (int j = 1; j < dulieu.Count() - 1; j++)
            {
                dgv_dulieu.Rows.Add(dulieu[j]);
            }

            for (int colIndex = 0; colIndex < dgv_dulieu.Columns.Count; colIndex++)
            {
                for (int rowIndex = 0; rowIndex < dgv_dulieu.Rows.Count - 1; rowIndex++)
                {
                    string temp = dgv_dulieu.Rows[rowIndex].Cells[colIndex].Value.ToString();
                    switch (temp)
                    {
                        case "?":
                            dgv_dulieu.Rows[rowIndex].Cells[colIndex].Style.ForeColor = Color.Red;
                            break;
                        default:
                            break;
                    }
                }
            }
        }

        /*-----------------------------------CHIA GIỎ---------------------------------------------*/

        //Sắp xếp dữ liệu
        private void sapXep(int j)
        {
            for (int co = 1; co < dulieu.Count() - 2; co++)
            {
                for (int co1 = co + 1; co1 < dulieu.Count() - 1; co1++)
                {
                    if (Convert.ToDouble(dulieu[co1][j]) <= Convert.ToDouble(dulieu[co][j]))
                    {
                        string temp = dulieu[co1][j];
                        dulieu[co1][j] = dulieu[co][j];
                        dulieu[co][j] = temp;
                    }
                }
            }

        }

        //Chia giỏ theo chiều rộng
        private void chiaGioChieuRong(int j, int soGio)
        {
            sapXep(j);//Sắp xếp giá trị thuộc tính thứ j tăng dần

            double min = Convert.ToDouble(dulieu[1][j]);//Giá trị min
            double max = Convert.ToDouble(dulieu[dulieu.Count() - 2][j]);//Giá trị max
            double khoanCachGio = (double)((max - min) / Convert.ToDouble(txt_sogio.Text));//Khoản cách của từng giỏ

            List<string[]> lstGio = new List<string[]>();//Lưu danh sách các giỏ

            double bienTrai = Convert.ToDouble(dulieu[1][j]);//Giá trị biên trái của giỏ

            for (int i = 1; i < dulieu.Count() - 1; i++)//Duyệt hết giá trị của thuộc tính
            {
                double bienPhai = bienTrai + khoanCachGio;//Giá trị biên phải của giỏ

                string line = string.Empty;
                if (Convert.ToDouble(dulieu[i][j]) >= bienTrai || Convert.ToDouble(dulieu[i][j]) <= bienPhai)//Nếu giá trị thuộc hai biên của giỏ
                {
                    line = line + dulieu[i][j] + ",";//Thêm vào giỏ
                }
                else//Dữ liệu ngoài giỏ
                {
                    //Thêm giỏ đó vào danh sách giỏ
                    lstGio.Add(line.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries));

                    line = string.Empty;//Tiếp tục thêm giá trị vào giỏ mới
                    line = line + dulieu[i][j] + ",";
                    //Cập nhật lại biên trái và phải của giỏ mới
                    bienTrai = bienPhai;
                    bienPhai = bienTrai + khoanCachGio;
                }
            }

            for (int g = 0; g < lstGio.Count(); g++)//Xử lý dữ liệu trên từng giỏ, bằng cách lấy giá trị trung bình của giỏ
            {
                double giaTriTB = layGiaTriTBGio(lstGio[g], g);
                for (int f = 0; f < lstGio[g].Length; f++)
                {
                    lstGio[g][f] = giaTriTB.ToString();
                }
            }

            int index = 1;
            for (int k = 0; k < lstGio.Count(); k++)//Tiến hành lưu dữ liệu đã chia của thuộc tính j vào 
            {
                for (int s = 0; s < lstGio[k].Length; s++)
                {
                    dulieu[index++][j] = lstGio[k][s];
                }
            }

            //Hiện thị dữ liệu sau khi chia lên màn hình
            hienThiDuLieuGio();
        }

        //Lấy giá trị trung bình của từng giỏ
        private double layGiaTriTBGio(string[] lstGio, int g)
        {
            double s = 0;
            for (int j = 0; j < lstGio.Length; j++)
            {
                s = s + Convert.ToDouble(lstGio[g][j]);
            }

            return Math.Round(s / lstGio.Length, 3);
        }

        //Chia giỏ theo chiều sau
        private void chiaGioChieuSau(int j, int soGio)
        {
            sapXep(j);//Sắp xếp giá trị thuộc tính thứ j tăng dần

            List<string[]> lstGio = new List<string[]>();//Lưu danh sách các giỏ

            int count = 0;
            for (int i = 1; i < dulieu.Count() - 1; i++)//Duyệt hết giá trị của thuộc tính
            {
                string line = string.Empty;
                if (count < soGio)//Nếu còn 
                {
                    line = line + dulieu[i][j] + ",";
                    count++;
                }
                else//Giỏ đầy
                {
                    lstGio.Add(line.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries));//Thêm giỏ vào danh sách giỏ
                    //Thêm giỏ mới
                    line = string.Empty;
                    line = line + dulieu[i][j] + ",";
                    count = 1;

                }
            }

            for (int g = 0; g < lstGio.Count(); g++)//Xử lý dữ liệu trên từng giỏ, bằng cách lấy giá trị trung bình của giỏ
            {
                double giaTriTB = layGiaTriTBGio(lstGio[g], g);
                for (int f = 0; f < lstGio[g].Length; f++)
                {
                    lstGio[g][f] = giaTriTB.ToString();
                }
            }

            int index = 1;
            for (int k = 0; k < lstGio.Count(); k++)//Tiến hành lưu dữ liệu đã chia của thuộc tính j vào 
            {
                for (int s = 0; s < lstGio[k].Length; s++)
                {
                    dulieu[index++][j] = lstGio[k][s];
                }
            }

            hienThiDuLieuGio();
        }

        //Hiển thị dữ liệu sau khi chia giỏ xong
        private void hienThiDuLieuGio()
        {
            dgv_dulieuchiagio.Columns.Clear();
            dgv_dulieuchiagio.Rows.Clear();
            dgv_dulieuchiagio.ColumnCount = dulieu[0].Length;
            for (int i = 0; i < dulieu[0].Length; i++)
            {
                dgv_dulieuchiagio.Columns[i].Name = dulieu[0][i].Replace("\"", "");
            }
            for (int j = 1; j < dulieu.Count() - 1; j++)
            {
                dgv_dulieuchiagio.Rows.Add(dulieu[j]);
            }
        }

        /*-----------------------------------CHUẨN HÓA---------------------------------------------*/

        //Chuẩn hóa min-max
        private void chuanHoaMinMax(int j)
        {
            double min = giaTriMin(j);
            double max = giaTriMax(j);
            double range = max - min;

            for (int i = 1; i < dulieu.Count() - 1; i++)
            {
                double giaTri = Convert.ToDouble(dulieu[i][j]);
                double kq = Math.Round((((giaTri - min) / (range)) * (1 - 0) + 0), 3);
                dulieu[i][j] = kq.ToString();
            }

        }

        //Lấy giá trị lớn nhất
        private double giaTriMax(int j)
        {
            double max = Convert.ToDouble(dulieu[1][j]);

            for (int i = 2; i < dulieu.Count() - 1; i++)
            {
                if (Convert.ToDouble(dulieu[i][j]) > max)
                {
                    max = Convert.ToDouble(dulieu[i][j]);
                }
            }
            return max;
        }

        //Lấy giá trị lớn nhất
        private double giaTriMin(int j)
        {
            double min = Convert.ToDouble(dulieu[1][j]);

            for (int i = 2; i < dulieu.Count() - 1; i++)
            {
                if (Convert.ToDouble(dulieu[i][j]) < min)
                {
                    min = Convert.ToDouble(dulieu[i][j]);
                }
            }
            return min;
        }

        //Chuẩn hóa z-score
        private void chuanHoaZScore(int j)
        {
            double giaTriTB = tinhGiaTriTB(j);
            double doLechChuan = tinhDoLechChuan(j, giaTriTB);

            for (int i = 1; i < dulieu.Count - 1; i++)
            {
                double gt = Convert.ToDouble(dulieu[i][j]);
                double kq = Math.Round((gt - giaTriTB) / doLechChuan, 3);
                dulieu[i][j] = kq.ToString();
            }
        }

        //Tính độ lệch chuẩn
        private double tinhDoLechChuan(int j, double giaTriTB)
        {
            double s = 0;
            for (int i = 1; i < dulieu.Count - 1; i++)
            {
                double gt = Convert.ToDouble(dulieu[i][j]);
                s = s + (gt - giaTriTB) * (gt - giaTriTB);
            }

            return Math.Round(Math.Sqrt(s), 3);
        }

        //Hiển thị dữ liệu sau khi chuẩn hóa
        private void hienThiDuLieuChuanHoa()
        {
            dgv_dulieuchuanhoa.Columns.Clear();
            dgv_dulieuchuanhoa.Rows.Clear();
            dgv_dulieuchuanhoa.ColumnCount = dulieu[0].Length;
            for (int i = 0; i < dulieu[0].Length; i++)
            {
                dgv_dulieuchuanhoa.Columns[i].Name = dulieu[0][i].Replace("\"", "");
            }
            for (int j = 1; j < dulieu.Count() - 1; j++)
            {
                dgv_dulieuchuanhoa.Rows.Add(dulieu[j]);
            }
        }
        #endregion

    }
}
